package controller;

import javax.swing.text.Style;

import preferences.Preferences;
import gui.JCodeView;
import gui.JColoredTextZone;
import tools.CodeFile;
/**
 * Faire le lien entre l'interface graphique et les routines (modèle MVC)
 * 
 * @author			Christos Kornaros, Grégory Moinat, Nicolas Muller
 * @version			1.0, 02.04.2008
 * Fichier :		Controller.java
 * Remarque(s) :	-
 * Compilateur : 	jdk1.6.0_02
*/ 
public class Controller {

	private CodeFile file = new CodeFile();
	private JCodeView frame;
	private Preferences prefs;
	
	/**
	* Constructeur
	*
	* @param frame La fenetre principal de l'application
	*/   
	public Controller (JCodeView frame) {
		this.frame = frame;
		prefs = new Preferences(this);
	}
	
	/**
	* Creer un nouveau fichier
	*
	*/   
	public void newFile() {
		file.newFile();
	}
	
	/**
	 * Recolore le texte
	 *
	 */
	public void reScan(){
		frame.getTxtEditorZone().getCodeDocument().reScan();
	}

	/**
	* Ouvrir un fichier
	* @param parent La fenetre parent (modal)
	* @param path Le chemin complet du fichier à ouvrir
	*
	*/   
	public void openFile(JColoredTextZone parent, String path ) {
		file.open(frame.getTxtEditorZone(), path);
	}
	
	/**
	* Enregistrer un fichier
	*
	*/   
	public void saveFile() {
		saveFileAs(file.getPath());
	}
	
	/**
	* Enregistrer une nouvelle copie
	* @param path Le chemin complet du fichier à sauvegarder
	*/   
	public void saveFileAs(String path) {
		file.save(frame.getTxtEditorZone(), path);
	}

	/**
	* Fermer le fichier
	*
	*/   
	public void closeFile() {
			file.close();
	}
	
	/**
	* Verification s'il y a eu un changement entre le texte intial et le texte courant du fichier
	* 
	* @param currentText texte avec lequel comparer l'original
	* @return Retourne True s'il y a eu un changement et False sinon
	*/	
	public boolean fileModification(String currentText) {
		return !file.getInitialText().equals(currentText);
	}
	
	/**
	* Obtenir le chemin du fichier courant
	* 
	* @return Le chemin du fichier ouvert
	*/   
	public String getPathOfFile() {
		return file.getPath();
	}
	
	/**
	* Lit les préférences dans le fichier et les applique à l'application
	* 
	*/
	public void readAndApplyPrefs() {
		frame.setPreferredSize(prefs.getWindowSize());
		frame.setLocation(prefs.getWindowPosition());
		prefs.readColoration();
		prefs.readGeneral();
		reScan();
		frame.pack();
	}

	/**
	* Sauvegarde les propriétés de l'application dans le fichier de préférences
	* 
	*/
	public void writePrefs () {
		prefs.setWindowSize(frame.getSize().width, frame.getSize().height);
		prefs.setWindowPosition(frame.getLocation().x, frame.getLocation().y);
		prefs.saveColoration();
		prefs.saveGeneral();
	}
	
	/**
	 * Donne le style des commentaires
	 * 
	 * @return Style utilisé
	 */
	public Style getCommentsAttributes() {
		return frame.getTxtEditorZone().getCodeDocument().getCommentsAttributes();
	}


	/**
	 * Définit le style des commentaires
	 * 
	 * @param commentsAttributes style a utiliser
	 */
	public void setCommentsAttributes(Style commentsAttributes) {
		frame.getTxtEditorZone().getCodeDocument().setCommentsAttributes(commentsAttributes);
	}


	/**
	 * Donne le style des mots-clés
	 * 
	 * @return Style utilisé
	 */
	public Style getKeywordAttributes() {
		return frame.getTxtEditorZone().getCodeDocument().getKeywordAttributes();
	}


	/**
	 * Définit le style des mots-clés
	 * 
	 * @param keywordAttributes style a utiliser
	 */
	public void setKeywordAttributes(Style keywordAttributes) {
		frame.getTxtEditorZone().getCodeDocument().setKeywordAttributes(keywordAttributes);
	}


	/**
	 * Donne le style des nombres
	 * 
	 * @return Style utilisé
	 */
	public Style getNumberAttributes() {
		return frame.getTxtEditorZone().getCodeDocument().getNumberAttributes();
	}


	/**
	 * Définit le style des nombres
	 * 
	 * @param numberAttributes style a utiliser
	 */
	public void setNumberAttributes(Style numberAttributes) {
		frame.getTxtEditorZone().getCodeDocument().setNumberAttributes(numberAttributes);
	}


	/**
	 * Donne le style des strings
	 * 
	 * @return Style utilisé
	 */
	public Style getStringAttributes() {
		return frame.getTxtEditorZone().getCodeDocument().getStringAttributes();
	}

	/**
	 * Définit le style des strings
	 * 
	 * @param stringAttributes style a utiliser
	 */
	public void setStringAttributes(Style stringAttributes) {
		frame.getTxtEditorZone().getCodeDocument().setStringAttributes(stringAttributes);
	}
	
	/**
	 * Donne l'état de remplacement des tabulation par des espaces
	 * 
	 * @return vrai si on remplace faux sinon
	 */
	public boolean isReplaceTab() {
		return frame.getTxtEditorZone().getCodeDocument().isReplaceTab();
	}


	/**
	 * Définit si il faut remplacer ou non les tabulations par des espaces
	 * 
	 * @param replaceTab vrai si on remplace faux sinon
	 */
	public void setReplaceTab(boolean replaceTab) {
		frame.getTxtEditorZone().getCodeDocument().setReplaceTab(replaceTab);
	}


	/**
	* Sélecteur du nombre d'espace utilisé lors d'une tabulation 
	* 
	* @return Retourne le nombre d'espace utilisé lors d'une tabulation
	*/
	public int getTabSize() {
		return frame.getTxtEditorZone().getCodeDocument().getTabSize();
	}

	/**
	* Modificateur du nombre d'espace utilisé lors d'une tabulation 
	* 
	* @param tabSize Nombre d'espace pour une tabulation
	*/
	public void setTabSize(int tabSize) {
		frame.getTxtEditorZone().setNbTabs(tabSize);
	}
	
	/**
	 * Donne le style des caractères
	 * 
	 * @return Style utilisé
	 */
	public Style getCharacterAttributes() {
		return frame.getTxtEditorZone().getCodeDocument().getCharacterAttributes();
	}


	/**
	 * Définit le style des caractères
	 * 
	 * @param characterAttributes style a utiliser
	 */
	public void setCharacterAttributes(Style characterAttributes) {
		frame.getTxtEditorZone().getCodeDocument().setCharacterAttributes(characterAttributes);
	}
	
	/**
	 * Donne le style des preprocesseurs
	 * 
	 * @return Style utilisé
	 */
	public Style getPreprocessAttributes() {
		return frame.getTxtEditorZone().getCodeDocument().getPreprocessAttributes();
	}


	/**
	 * Définit le style des preprocesseurs
	 * 
	 * @param preprocessAttributes style a utiliser
	 */
	public void setPreprocessAttributes(Style preprocessAttributes) {
		frame.getTxtEditorZone().getCodeDocument().setPreprocessAttributes(preprocessAttributes);
	}

}
